﻿// See https://aka.ms/new-console-template for more information

namespace TypeDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            /// <summary>
            /// 数据类型 分为 "值类型" "引用类型"
            /// </summary>

            Console.WriteLine("值类型");
            Console.WriteLine("");
            //值类型 - 整形
            int ints = 10;
            Console.WriteLine($"int：{ints}  32位");
            //范围：-2147483648 到 2147483647

            long longs = 123456789;
            Console.WriteLine($"long：{longs}  64位");
            //范围：-9223372036854775808 到 9223372036854775807


            //值类型 - 字节类型
            byte[] bytes = new byte[10];
            for (int i = 0; i < 5; i++)
            {
                bytes[i] = (byte)i;
                Console.WriteLine($"byte：{bytes[i]} ");
                // 范围：0-255之间
            }


            //值类型 - 浮点型
            float floats = 1.11F; 
            Console.WriteLine($"float：{floats}" + "   单精度");
            double doubles = 1.123456789d; 
            Console.WriteLine($"double：{doubles}" + "   双精度");
            decimal decimals = 1.123456789123456789M; 
            Console.WriteLine($"decimal：{decimals}" + "   高精度");
            //后面加上字母之后代表数据直接定义为对应的类型 没有加的情况下C#可能将其当作其他类型进行处理


            //值类型 - 布尔类型
            bool booltrue = true;
            bool boolfalse = false;
            Console.WriteLine($"bool：{booltrue}" + $" 或  {boolfalse}");


            //值类型 - 枚举类型
            Console.WriteLine($"enum：{Color.Red},{Color.Green},{Color.Blue}");



        //值类型 - 结构体类型
        MyStruct myStruct = new MyStruct(10, 20);
            myStruct.Display();

            Console.WriteLine("");
            Console.WriteLine("引用类型");
            Console.WriteLine("");

            //引用类型 - 字符串类型
            string str = "测试字符串";
            Console.WriteLine($"string：{str}");

            //引用类型 - 数组
            int[] arr = new int[5];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = i;
                Console.WriteLine($"array：{arr[i]}");
            }

            //引用类型 - 类
            MyClassWithMethod myClassWithMethod = new MyClassWithMethod();
            myClassWithMethod.MyMethod();


            //引用类型 - 对象
            MyObject myObject = new MyObject(1, "测试对象");
            Console.WriteLine($"object：Id={myObject.Id}, Name={myObject.Name}");

            //引用类型 - 委托
            MyClassWithDelegate delegateClass = new MyClassWithDelegate();
            delegateClass.MyEvent += (message) => Console.WriteLine($"delegate：{message}");
            delegateClass.TriggerEvent("测试委托");
        }
    }

    //值类型 - 结构体类型
    public struct MyStruct
    {
        public int x;
        public int y;
        public MyStruct(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
        public void Display()
        {
            Console.WriteLine($"struct: x: {x}, y: {y}");
        }
    }
    //值类型 - 枚举
    public enum Color
    {
        Red,
        Green,
        Blue
    }

    //引用类型 - 接口
    public interface IMyInterface
    {
        void MyMethod();
    }
    public class MyClass : IMyInterface
    {
        public void MyMethod()
        {
            Console.WriteLine("interface: 调用接口");
        }
    }
    //引用类型 - 类
    public class MyClassWithMethod
    {
        public void MyMethod()
        {
            Console.WriteLine("class: 调用类");
        }
    }

    //引用类型 - 对象
    public class MyObject
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public MyObject(int id, string name)
        {
            Id = id;
            Name = name;
        }
    }

    //引用类型 - 委托
    public delegate void MyDelegate(string message);
    public class MyClassWithDelegate
    {
        public event MyDelegate MyEvent;
        public void TriggerEvent(string message)
        {
            MyEvent?.Invoke(message);
        }
    }
}


